package org.ziwei.paipan.biao;

import org.ziwei.paipan.var.DiZhi;
import org.ziwei.paipan.var.StarCode;
import org.ziwei.paipan.var.TianGan;

/**
 * 干系诸星表
 * 根据出生年天干，定干系诸星宫位
 */
public class GanXiZhuXingBiao {
	
	/**
	 * 贵人星，有阴阳分别，
	 * 天魁是阳贵人，天钺是阴贵人
	 * 天魁口诀：
	 * 甲戊庚生人，天魁在丑宫，天钺在未宫
	 * 乙己生人，天魁在子宫，天钺在申宫
	 * 丙丁生人，天魁在亥宫，天钺在酉宫
	 * 辛年生人，天魁在午宫，天钺在寅宫
	 * 壬癸生人，天魁在卯宫，天钺在巳宫
	 */
	private static DiZhi[] tianKuiBiao = {DiZhi.CHOU,DiZhi.ZI,DiZhi.HAI,DiZhi.HAI,DiZhi.CHOU,DiZhi.ZI,DiZhi.CHOU,DiZhi.WU,DiZhi.MAO,DiZhi.MAO};
	private static DiZhi[] tianYueBiao = {DiZhi.WEI,DiZhi.SHEN,DiZhi.YOU,DiZhi.YOU,DiZhi.WEI,DiZhi.SHEN,DiZhi.WEI,DiZhi.YIN,DiZhi.SI,DiZhi.SI};

	/**
	 * 根据生年天干，返回天魁所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anTianKui(TianGan tianGan){
		return tianKuiBiao[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回天钺所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anTianYue(TianGan tianGan){
		return tianYueBiao[tianGan.ordinal()];
	}
	
	/**
	 * 禄存，擎羊，陀罗三颗星曜始终不分离
	 * 禄存在中间，擎羊在前，陀罗在后，确定禄存位置，前一宫为擎羊，后一宫位陀罗
	 * 禄存史财星，擎羊屎烦恼，陀罗是纠纷，意思是凡是想求财，则事前一定烦恼，事后每多纠纷。 有财的人左右容易遭小人挟持。
	 * 歌诀：
	 * 禄存由寅起甲，顺行，不入辰戌丑未四墓库，丙戊丁己重叠。
	 */
	private static DiZhi[] luCunBiao =   {DiZhi.YIN,DiZhi.MAO,DiZhi.SI,DiZhi.WU,DiZhi.SI,DiZhi.WU,DiZhi.SHEN,DiZhi.YOU,DiZhi.HAI,DiZhi.ZI};
	private static DiZhi[] qingYangBiao = {DiZhi.MAO,DiZhi.CHEN,DiZhi.WU,DiZhi.WEI,DiZhi.WU,DiZhi.WEI,DiZhi.YOU,DiZhi.XU,DiZhi.ZI,DiZhi.CHOU};
	private static DiZhi[] tuoLuoBiao =  {DiZhi.CHOU,DiZhi.YIN,DiZhi.CHEN,DiZhi.SI,DiZhi.CHEN,DiZhi.SI,DiZhi.WEI,DiZhi.SHEN,DiZhi.XU,DiZhi.HAI};

	/**
	 * 根据生年天干，返回禄存所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anLuCun(TianGan tianGan){
		return luCunBiao[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回擎羊所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anQingYang(TianGan tianGan){
		return qingYangBiao[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回陀罗所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anTuoLuo(TianGan tianGan){
		return tuoLuoBiao[tianGan.ordinal()];
	}
	
	/**
	 * 四化表
	 * 四化星根据生年天干，并不自成主星，而是停留在其他星曜下面
	 * 安禄权科忌四星变化诀 
	 * 论生年干 挟火而化
	 * 甲廉破武阳，乙机梁紫阴
	 * 丙同机昌廉，丁阴同机巨
	 * 戊贪阴弼机，己武贪梁曲
	 * 庚阳武府同，辛巨阳曲昌
	 * 壬梁紫左武，癸破巨阴贪
	 * 如甲年生人，廉贞化禄、破军化权、武曲化科、太阳化忌。
	 * 如己年生人，武曲化禄，贪狼化权，天梁化科，文曲化忌。
	 * 在有四化的该星下方，写上禄、权、科或忌。
	 */
	private static StarCode[] huaLuBiao = {StarCode.LIANZHEN,StarCode.TIANJI,StarCode.TIANTONG,StarCode.TAIYIN,StarCode.TANLANG,StarCode.WUQU,StarCode.TAIYANG,StarCode.JUMEN,StarCode.TIANLIANG,StarCode.POJUN};
	private static StarCode[] huaQuanBiao = {StarCode.POJUN,StarCode.TIANLIANG,StarCode.TIANJI,StarCode.TIANTONG,StarCode.TAIYIN,StarCode.TANLANG,StarCode.WUQU,StarCode.TAIYANG,StarCode.ZIWEI,StarCode.JUMEN};
	private static StarCode[] huaKeBiao = {StarCode.WUQU,StarCode.ZIWEI,StarCode.WENCHANG,StarCode.TIANJI,StarCode.YOUBI,StarCode.TIANLIANG,StarCode.TAIYIN,StarCode.WENQU,StarCode.ZUOFU,StarCode.TAIYIN};
	private static StarCode[] huaJiBiao = {StarCode.TAIYANG,StarCode.TAIYIN,StarCode.LIANZHEN,StarCode.JUMEN,StarCode.TIANJI,StarCode.WENQU,StarCode.TIANTONG,StarCode.WENCHANG,StarCode.WUQU,StarCode.TANLANG};
	
	/**
	 * 根据生年天干，返回化禄所在星曜
	 * @param tianGan 生年天干
	 * @return StarCode
	 */
	public static StarCode anHuaLu(TianGan tianGan){
		return huaLuBiao[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回化权所在星曜
	 * @param tianGan 生年天干
	 * @return StarCode
	 */
	public static StarCode anHuaQuan(TianGan tianGan){
		return huaQuanBiao[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回化科所在星曜
	 * @param tianGan 生年天干
	 * @return StarCode
	 */
	public static StarCode anHuaKe(TianGan tianGan){
		return huaKeBiao[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回化忌所在星曜
	 * @param tianGan 生年天干
	 * @return StarCode
	 */
	public static StarCode anHuaJi(TianGan tianGan){
		return huaJiBiao[tianGan.ordinal()];
	}
	
	/**
	 * 天官天福是两个吉星
	 * 安天官天福诀： 
	 * 甲喜羊鸡乙龙猴，丙年蛇鼠一窝谋
	 * 丁虎擒猪戊玉兔，己鸡居然与虎俦
	 * 庚猪马辛鸡蛇走，壬犬马癸马蛇游
	 */
	private static DiZhi[] tianGuanBiao ={DiZhi.WEI,DiZhi.CHEN,DiZhi.SI,DiZhi.YIN,DiZhi.MAO,DiZhi.YOU,DiZhi.HAI,DiZhi.YOU,DiZhi.XU,DiZhi.WU};
	private static DiZhi[] tianFuBiao =  {DiZhi.YOU,DiZhi.SHEN,DiZhi.ZI,DiZhi.HAI,DiZhi.MAO,DiZhi.YIN,DiZhi.WU,DiZhi.SI,DiZhi.WU,DiZhi.SI};
	
	/**
	 * 根据生年天干，返回天官所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anTianGuan(TianGan tianGan){
		return tianGuanBiao[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回天福所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anTianFu(TianGan tianGan){
		return tianFuBiao[tianGan.ordinal()];
	}
	
	/**
	 * 截空星是一颗星占两个宫位，分为一正空一傍空，正宫重，傍宫轻，凡天干是阳性的所占阳宫为证空，
	 */
	private static DiZhi[] jieKongBiao1 = {DiZhi.SHEN,DiZhi.WU,DiZhi.CHEN,DiZhi.YIN,DiZhi.ZI,DiZhi.SHEN,DiZhi.WU,DiZhi.CHEN,DiZhi.YIN,DiZhi.ZI};
	private static DiZhi[] jieKongBiao2 = {DiZhi.YOU,DiZhi.WEI,DiZhi.SI,DiZhi.MAO,DiZhi.CHOU,DiZhi.YOU,DiZhi.WEI,DiZhi.SI,DiZhi.MAO,DiZhi.CHOU};

	/**
	 * 根据生年天干，返回截空1所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anJieKong1(TianGan tianGan){
		return jieKongBiao1[tianGan.ordinal()];
	}
	
	/**
	 * 根据生年天干，返回截空2星所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anJieKong2(TianGan tianGan){
		return jieKongBiao2[tianGan.ordinal()];
	}
	
	private static DiZhi[] tianChuBiao = {DiZhi.SI,DiZhi.WU,DiZhi.ZI,DiZhi.SI,DiZhi.WU,DiZhi.SHEN,DiZhi.YIN,DiZhi.WU,DiZhi.YOU,DiZhi.HAI};

	/**
	 * 根据生年天干，返回天厨所在宫支
	 * @param tianGan 生年天干
	 * @return DiZhi
	 */
	public static DiZhi anTianChu(TianGan tianGan){
		return tianChuBiao[tianGan.ordinal()];
	}

}
